package com.bf.electroplating.util;

import java.util.HashMap;
import java.util.Map;

/**
 * HJ212协议监测因子编码映射工具类
 * 
 * @author system
 * @since 2025-10-09
 */
public class HJ212FactorCodeMapping {

    /**
     * 因子编码到因子名称的映射
     */
    public static final Map<String, String> FACTOR_CODE_TO_NAME = new HashMap<>();

    /**
     * 因子编码到字段前缀的映射（用于反射或动态设置字段值）
     */
    public static final Map<String, String> FACTOR_CODE_TO_FIELD_PREFIX = new HashMap<>();

    /**
     * 因子编码到单位的映射
     */
    public static final Map<String, String> FACTOR_CODE_TO_UNIT = new HashMap<>();

    /**
     * 标志位说明
     */
    public static final Map<String, String> FLAG_DESCRIPTION = new HashMap<>();

    static {
        // 初始化因子编码到名称的映射
        FACTOR_CODE_TO_NAME.put("w01001", "PH值");
        FACTOR_CODE_TO_NAME.put("w01018", "流量");
        FACTOR_CODE_TO_NAME.put("w20116", "六价铬");
        FACTOR_CODE_TO_NAME.put("w20117", "六价铬");
        FACTOR_CODE_TO_NAME.put("w20120", "总氰化物");
        FACTOR_CODE_TO_NAME.put("w20121", "总镍");
        FACTOR_CODE_TO_NAME.put("w20122", "总铜");
        FACTOR_CODE_TO_NAME.put("w20123", "总锌");
        FACTOR_CODE_TO_NAME.put("w20125", "总铬");
        FACTOR_CODE_TO_NAME.put("w21001", "COD");
        FACTOR_CODE_TO_NAME.put("w21002", "总氮");
        FACTOR_CODE_TO_NAME.put("w21003", "氨氮");
        FACTOR_CODE_TO_NAME.put("w21011", "总磷");

        // 初始化因子编码到字段前缀的映射
        FACTOR_CODE_TO_FIELD_PREFIX.put("w01001", "ph");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w01018", "flowRate");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20116", "chromium6");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20117", "chromium6");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20120", "totalCyanide");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20121", "totalNickel");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20122", "totalCopper");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20123", "totalZinc");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w20125", "totalChromium");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w21001", "cod");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w21002", "totalNitrogen");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w21003", "ammoniaNitrogen");
        FACTOR_CODE_TO_FIELD_PREFIX.put("w21011", "totalPhosphorus");

        // 初始化因子编码到单位的映射
        FACTOR_CODE_TO_UNIT.put("w01001", "");
        FACTOR_CODE_TO_UNIT.put("w01018", "m³/h");
        FACTOR_CODE_TO_UNIT.put("w20116", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20117", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20120", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20121", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20122", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20123", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w20125", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w21001", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w21002", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w21003", "mg/L");
        FACTOR_CODE_TO_UNIT.put("w21011", "mg/L");

        // 初始化标志位说明
        FLAG_DESCRIPTION.put("N", "正常");
        FLAG_DESCRIPTION.put("D", "双信号");
        FLAG_DESCRIPTION.put("C", "修正");
        FLAG_DESCRIPTION.put("S", "停运");
        FLAG_DESCRIPTION.put("M", "维护");
        FLAG_DESCRIPTION.put("F", "故障");
        FLAG_DESCRIPTION.put("B", "缺失");
        FLAG_DESCRIPTION.put("T", "调试");
    }

    /**
     * 根据因子编码获取因子名称
     * 
     * @param factorCode 因子编码（如：w21001）
     * @return 因子名称（如：COD）
     */
    public static String getFactorName(String factorCode) {
        return FACTOR_CODE_TO_NAME.getOrDefault(factorCode, "未知因子");
    }

    /**
     * 根据因子编码获取字段前缀
     * 
     * @param factorCode 因子编码（如：w21001）
     * @return 字段前缀（如：cod）
     */
    public static String getFieldPrefix(String factorCode) {
        return FACTOR_CODE_TO_FIELD_PREFIX.get(factorCode);
    }

    /**
     * 根据因子编码获取单位
     * 
     * @param factorCode 因子编码（如：w21001）
     * @return 单位（如：mg/L）
     */
    public static String getUnit(String factorCode) {
        return FACTOR_CODE_TO_UNIT.getOrDefault(factorCode, "");
    }

    /**
     * 根据标志位获取说明
     * 
     * @param flag 标志位（如：N）
     * @return 标志位说明（如：正常）
     */
    public static String getFlagDescription(String flag) {
        return FLAG_DESCRIPTION.getOrDefault(flag, "未知状态");
    }

    /**
     * 判断标志位是否为正常数据
     * 
     * @param flag 标志位
     * @return true表示数据正常可用，false表示数据异常
     */
    public static boolean isNormalFlag(String flag) {
        return "N".equals(flag) || "D".equals(flag) || "C".equals(flag);
    }

    /**
     * 判断标志位是否为异常数据（设备故障、维护、缺失等）
     * 
     * @param flag 标志位
     * @return true表示数据异常不可用
     */
    public static boolean isAbnormalFlag(String flag) {
        return "F".equals(flag) || "M".equals(flag) || "B".equals(flag) || "S".equals(flag) || "T".equals(flag);
    }
}

